package com.zhage.controller;


import org.apache.commons.io.FilenameUtils;
import org.springframework.util.ResourceUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

@RequestMapping("file")
@RestController
public class FileController {

    /**
     * 传入的参数是MultipartFile
     * 加入@RequestParam注解表示该参数一定要接受到，接受到的是前端的file
     * 根据自己需求可以有其他参数，这里就演示文件上传
     * @param req
     * @return
     */
    @PostMapping("upload")
    public String upload(HttpServletRequest req) throws IOException {

        MultipartHttpServletRequest mreq = (MultipartHttpServletRequest)req;
        MultipartFile mf = mreq.getFile("file");
        String file = req.getParameter("file");
        System.out.println(file);
        /**
         * 获取项目绝对路径
         * 最终文件上传是需要绝对路径的
         * 相当于给要上传的位置定个坐标
         * classpath:就可以去获得resources的目录
         * 具体classpath:获得resources的原因就得自己去探索了，本文主要是讲文件上传
         * 这里不去除first的话这个路径开头会有一个/，虽然没有什么影响
         */
        String absPath = ResourceUtils.getURL("classpath:").getPath().replaceFirst("/","") + "static/files";
        /**
         * 创建文件目录
         * 根据自己的需求
         * 在这我就以当前时间创建
         */
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd-HH-mm");
        //文件的目录应该为绝对路径+目录名
        String dirPath = absPath+"/"+sdf.format(new Date());
        //通过这个路径创建目录
        File dir = new File(dirPath);
        //如果不存在就创建该目录
        if(!dir.exists()){
            dir.mkdirs();
        }
        /**
         * 创建文件
         * 文件名字就根据自己的需求而定
         * 我这里为了方便，就叫cutezha吧
         */
        //先获取文件本身的名字
        String oldName = mf.getOriginalFilename();
        //使用FileNameUtils获取扩展名，这里获取的没有.所以手动加上
        String extension = "."+FilenameUtils.getExtension(oldName);
        String fileName = "cutezha"+extension;
        //上传文件
        mf.transferTo(new File(dir,fileName));
        /**
         * 将数据返回给前端，我这里就直接将路径返回了
         * 注意这里用dirPath才是斜杠，如果使用dir则是反斜杠
         */
        System.out.println(dirPath+"/"+fileName);
        return dirPath+"/"+fileName;
    }
}
